消息隊列(Message Queue)
2023-09-01
/在這篇文章中,我將介紹什麼是消息隊列、消息隊列的組成及相較於HTTP通訊有什麼優點。
前言
前陣子,團隊想要開發一個通知系統,專門用來整合其他系統的訊息,並且能夠處理各種平台(例如: Email、通訊軟體、前端介面等)的通知推送。為了不影響各系統原有的運作,我們打算使用異步分散式的方式來處理,因此我們接觸到了消息隊列(Message Queue),並希望利用它作為系統間的通訊中介層。在這篇文章中,我將記錄我蒐集的資料及學習消息隊列的心得。
消息隊列如何提升效率
在網路世界中,系統與系統之間最常見的溝通方式是透過 HTTP 連線交換訊息。客戶端發出請求後,服務端經過一連串的處理後回應客戶端訊息。但是,當請求量大或是處理邏輯複雜時,服務端就需要花更多的時間來處理。因此,對於不需要立即回應的請求,我們可以利用消息隊列來避免長時間的等待影響服務運行。
讓我們用一個例子來說明。你去人潮洶湧的夜市吃飯,想要吃地瓜球,於是你到賣地瓜球的攤販排隊。老闆一次只叫一個客人,等餐點做完之後,再問下一位顧客的需求。因此你只能乖乖地排隊,直到輪到你為止。如果客人不多還可以接受,但是如果排隊的客人很多,你可能就會等得不耐煩。
再想像另一個場景。你到一家連鎖雞排店排隊,但是店家引進了叫號系統。你只需留下你要訂的餐點與電話號碼,餐點做好了,系統就會自動傳訊息通知你。這樣你就可以去其他攤販逛逛或買其他東西,節省了寶貴的時間。
這與之前的方法相比是一個巨大的轉變。顧客不需要傻傻等待,可以利用時間做別的事情。這就是所謂的異步處理。消息隊列就是實現這種效果的工具。你將請求送給消息隊列,它們會暫存需要處理的請求,處理器接收請求並按照自己的節奏執行它。
什麼是消息隊列
消息隊列(Message Queue),從字面上的意思來說,它是一個"由訊息所組成的隊伍"。想要理解消息隊列,可以把它拆解為"隊列"和"訊息"。
隊列 (Queue)
按照到達順序排列的資料結構,因此第一個進到隊列中的項目,也會是第一個出來的項目,消息隊列遵守先進先出(First In, First Out, FIFO)原則。
消息 (Message)
發送者添加到隊列中的一段資料,添加到隊列中的資料通常是對接收系統執行某些任務的請求(例如:發送 email 或是電話號碼)或只是有關已完成任務的紀錄(log)
消息隊列的組成
消息隊列主要由以下三者組成:
- 生產者 (Producer): 生產者創建訊息,並把消息推送到隊列中
- 隊列 (Queue): 消息隊列的核心,負責接收訊息的地方,訊息將被存儲在此,直到消費者使用它們
- 消費者 (Consumer): 消費者獲取並處理訊息
消息隊列的特性與優點
如前面所述,建立消息隊列促進了系統或進程之間的異步溝通,換句話說,當訊息傳送到消息隊列時,發送的系統不需要等待立即回應,它可以繼續處理其它事情,而接收的系統可以按照自己的節奏接收及處理訊息,這大大地解耦了系統與系統之間的關係。
因為此項特性,消息隊列擁有以下幾點優勢:
提高系統效能 對一些比較耗時的操作,可以透過消息隊列進行異步處理。消息隊列中生產者的程式在得到處理結果之前就可以繼續執行,從而提高程式的處理效能
提高系統可維護性 使用消息隊列,生產者和消費者的代碼不需要進行任何的耦合,可以不需要知道生產者或消費者是誰,可以使用不同的程式語言撰寫,當有 bug 時也只需要修改其中一方的代碼,使程式維護性更高
隔離系統並降低系統錯誤影響範圍 因為生產者不直接依賴消費者,所以分佈式消息隊列可以將消費者系統產生的錯誤異常與生產者系統隔離開來,生產者不受消費者發生的錯誤的影響
易於控管訊息量 當上下游系統處理能力存在差距時,可在消息隊列進行訊息量控管,在下游有能力處理的時候,再進行分發處理
易於擴展 耗時的處理的訊息可以通過分佈式消息隊列,向多個消費者並行發送、處理消息,當負載上升的時候,可以很容易地添加更多的消費者
結論
本文概述了消息隊列的概念。簡而言之,消息隊列在訊息發送者與接收者間提供了一個中介層,作為消息的緩衝區,讓彼此之間可以異步溝通,也減少了系統間的依賴關係。正如前言所述,在我們團隊,我們利用消息隊列來實現各系統與通知系統間的通訊,避免增加原系統無謂的等待外,通知系統也可以在發生錯誤時重試,確保原系統不受影響。
消息隊列還有許多其他的應用場景,例如:
• 在電子商務網站中,當用戶下單後,可以將訂單資訊放入消息隊列,讓後端系統進行庫存管理、付款處理、發貨通知等操作,而不影響用戶的體驗。
• 在物聯網中,當設備收集到大量的數據時,可以將數據放入消息隊列,讓後端系統進行數據處理、存儲、分析等操作,而不影響設備的運行。
在瞭解了消息隊列的基礎知識後,之後有時間我將介紹一些知名的消息隊列及其優缺點。